//配置路由的地方
import Vue from 'vue'
import VueRouter from 'vue-router'

//使用路由插件
Vue.use(VueRouter)
import routes from './routes'
import store from '@/store'
//先把VueRouter原型对象的push，先保存一份
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace
//重写push||replace
//第一个参数：告诉原来Push方法,你往哪里跳转（传递哪些参数）
VueRouter.prototype.push = function (location,resolve,reject){
    if(resolve && reject){
        originPush.call(this,location,resolve,reject)
    }else{
        originPush.call(this,location,()=>{},()=>{})
    }
}
VueRouter.prototype.replace = function (location,resolve,reject){
    if(resolve && reject){
        originPush.call(this,location,resolve,reject)
    }else{
        originPush.call(this,location,()=>{},()=>{})
    }
}

//配置路由
let router =  new VueRouter({
    //配置路由
    routes,
    // 滚动行为，控制路由跳转时，页面展示的位置
    scrollBehavior(to, from, savePosistion) {
        //返回的这个y=0表示滚动条在最上方
        return { y: 0 }//距离顶部距离为零
    }
    
})
//全局守卫限制用户登录跳转页面设置
router.beforeEach(async(to,from,next)=>{
    //用户登录了，才会有token，未登录不一定没有token
    //如果用户已经登陆了还想跳转去login界面，则拒绝路由跳转
    // next()
    let token = store.state.user.token
    let UserName =store.state.user.UserInfo.name
    if(token){//先判断用户是否登录
        if(to.path == '/login' || to.path == '/register'){//登录后并再次去登录页面时，会直接跳转到首页
            next('/home')
        }else{
            //登录了并且去的时非登录页面
            if(UserName){//判断是否获取了用户信息
                next()
            }else{
                try{//若没有获取到用户信息，则派发请求获取，确保每个路由组件页面刷新后依旧保持登录状态
                  await store.dispatch('getUserInfo')
                  next()
                }catch(e){
                    //意味着token失效了，需要重新登录
                  await store.dispatch('LoginOut')
                   next('/login')
                }
            }
        }
    }else{
        //未登录:不能去支付 交易相关也不能去个人中心
        //如果未登录时去的时个人中心center，支付pay，交易页面时直接跳转到home页面
        if (to.path.indexOf('/center') != -1 || to.path.indexOf('/pay') != -1 || to.path.indexOf('/trade') != -1) {
            alert("请先登录！")
            //把未登录时想去而没有去成的路由信息存储与地址栏中
            next('/login?redirect=' + to.path)
        } else {
            //去其他的路由组件的时候放行
            next()
        }
    }
})

export default router